#!/bin/sh
#
# ypbind:       Starts the ypbind daemon
#
# Version:      @(#) /etc/init.d/ypbind.init 1.3
#
# chkconfig: - 24 76
# description: This is a daemon which runs on NIS/YP clients and binds them \
#              to a NIS domain. It must be running for systems based on glibc \
#              to work as NIS clients, but it should not be enabled on systems \
#              which are not using NIS.
# processname: ypbind
# config: /etc/yp.conf
#
# See https://fedoraproject.org/wiki/Packaging:SysVInitScript for 
# the guidelines document.

OTHER_YPBIND_OPTS=""

# Source function library.
[ -f /etc/rc.d/init.d/functions ] || exit 0
. /etc/rc.d/init.d/functions

# getting the YP domain name
[ -e /etc/sysconfig/network ] && . /etc/sysconfig/network

# Check for and source configuration file otherwise set defaults
[ -f /etc/sysconfig/ypbind ] && . /etc/sysconfig/ypbind

# NISTIMEOUT should be a multiple of 15 since
# ypwhich has a hardcoded 15sec timeout
[ -z "$NISTIMEOUT" ] && NISTIMEOUT=45

# Check that networking is configured.
[ "${NETWORKING}" = "no" ] && exit 0

exec="/usr/sbin/ypbind"
prog="ypbind"
lockfile=/var/lock/subsys/$prog

selinux_on() {
    [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled || return
    #echo $"Turning on allow_ypbind SELinux boolean"
    setsebool allow_ypbind=1
}

selinux_off() {
    [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled || return
    allow_ypbind=0
    .  /etc/selinux/config
    if [ -e /etc/selinux/${SELINUXTYPE}/modules/active/booleans.local ]; then
	. /etc/selinux/${SELINUXTYPE}/modules/active/booleans.local
    fi
    if [ $allow_ypbind == 0 ]; then
	#echo $"Turning off allow_ypbind SELinux boolean"
	setsebool allow_ypbind=$allow_ypbind
    fi
}

start() {
    [ $UID -eq 0 ] || exit 4
    [ -x $exec ] || exit 5
    DOMAINNAME=`domainname`
    if [ "$DOMAINNAME" = "(none)" -o "$DOMAINNAME" = "" ]; then
	echo -n $"Setting NIS domain: "
	if [ -n "$NISDOMAIN" ]; then
	    action $"domain is '$NISDOMAIN' " domainname $NISDOMAIN
	else # See if the domain is set in config file
	    NISDOMAIN=`grep "domain" /etc/yp.conf | grep -v ^# | \
		awk '{print $2}' | head -1`
	    if [ -n "$NISDOMAIN" ]; then
		action $"domain is '$NISDOMAIN' " \
		    domainname $NISDOMAIN
	    else
		action $"domain not found" /bin/false
		logger -t ypbind $"domain not found"
	        return 1
	    fi
	fi
    fi
    echo -n $"Starting NIS service: "
    selinux_on
    daemon $exec $OTHER_YPBIND_OPTS
    retval=$?
    echo
    if [ $retval -ne 0 ]; then
        #selinux_off
	logger -t ypbind "failed to start!"
	return $retval
    fi
    echo -n $"Binding NIS service: "
    # the following fixes problems with the init scripts continuing
    # even when we are really not bound yet to a server, and then things
    # that need NIS fail.
    timeout=10
    firsttime=1
    SECONDS=0
    while [ $SECONDS -lt $timeout ]; do
	if /usr/sbin/rpcinfo -p | LC_ALL=C fgrep -q ypbind
	then
	    if [ $firsttime -eq 1 ]; then
		# reset timeout
		timeout=$NISTIMEOUT
		firsttime=0
	    fi
	    /usr/bin/ypwhich > /dev/null 2>&1
	    retval=$?
	    if [ $retval -eq 0 ]; then
		break;
	    fi
	fi
	sleep 2
	echo -n "."
    done
    if [ $retval -eq 0 ]; then
	logger -t ypbind \
	    "NIS domain: `domainname`, NIS server: `ypwhich 2> /dev/null`"
	touch $lockfile
	success
    else
	logger -t ypbind \
	    "NIS server for domain `domainname` is not responding."
	failure
	#selinux_off
	retval=100
    fi
    echo
    return $retval
}

stop() {
    [ $UID -eq 0 ] || exit 4
    [ -x $exec ] || exit 5
    echo -n $"Shutting down NIS service: "
    killproc $prog
    retval=$?
    echo
    if [ $retval -eq 0 ]; then
	rm -f $lockfile
	# if  we used brute force (like kill -9) we don't want those around
	if [ x$(domainname) != x ]; then
	    rm -f /var/yp/binding/$(domainname)*
	fi
    fi
    #selinux_off
    return $retval
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading NIS service: "
    killproc $prog -HUP
    retval=$?
    echo
    return $retval
}

force_reload() {
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

usage() {
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
}

# See how we were called.
case "$1" in
    start)
	rh_status_q && exit 0
	$1
	retval=$?
	if [ $retval -eq 100 ]; then stop; exit 1; fi
	exit $retval
	;;
    stop)
        rh_status_q || exit 0
	$1	
	;;
    restart)
	$1
	;;
    reload)
	rh_status_q || exit 7
	$1
	;;
    force-reload)
	force_reload
	;;
    status)
	rh_status
	;;
    condrestart|try-restart)
	rh_status_q || exit 0
	restart
	;;
    usage)
	$1
	;;
    *)
	usage
	exit 2
esac
exit $?
